﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.IDAO;
using Sistema.Dominio;
using MySql.Data.MySqlClient;
using System.Data;

namespace Sistema.InnoDbDAO
{
    abstract class DAOBase<T>:IObjDados<T>where T:Entidade
    {
        protected IDataParameter AdicionarParametro(String nome,TipoParametro tipo,object valor)
        {
            MySqlParameter parametro = new MySqlParameter();
            parametro.ParameterName = nome;
            parametro.MySqlDbType = Tipo(tipo);
            parametro.Value = valor;
            return parametro;
        }
        private MySqlDbType Tipo(TipoParametro tipo)
        {
            switch (tipo)
            {
                case TipoParametro.DateTime:
                    return MySqlDbType.DateTime;
                case TipoParametro.Integer:
                    return MySqlDbType.Int64;
                case TipoParametro.Long:
                    return MySqlDbType.Int64;
                case TipoParametro.String:
                    return MySqlDbType.VarChar;
                default:
                    throw new NotImplementedException("Tipo de parametro informado invalido");
            }
        }

        protected abstract T DataReaderToObject(IDataReader dados);
        protected abstract String InstrucaoSelect();
        protected abstract String InstrucaoInsert();
        protected abstract String InstrucaoUpdate();
        protected abstract String InstrucaoDelete();
        protected abstract String ParametroInsert(T dados);
        protected abstract String ParametroUpdate(T dados);
        protected abstract String ParametroDelete(T dados);
        protected abstract String ParametroKey();
        protected abstract String Entidade();

        #region Implementacao de IObjDados
        public void Salvar(T dados)
        {
            

        }

        public void Alterar(T dados)
        {
            throw new NotImplementedException();
        }

        public void Excluir(T dadaos)
        {
            throw new NotImplementedException();
        }

        public T Buscar(Int32 id)
        {
            throw new NotImplementedException();
        }

        public IList<T> Listar()
        {
            throw new NotImplementedException();
        }
        public IList<T> Listar(String parametro)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
    
    public enum TipoParametro
    {
        Integer,
        String,
        Long,
        DateTime,
    }
}
